package com.ssy.lingxi.common.constant.order;

import com.ssy.lingxi.common.language.LanguageHolder;

import java.util.Arrays;

/**
 * 订单支付方式枚举
 *
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-19
 */
public enum OrderPayChannelEnum {
    /**
     * 不需要支付 - 0
     */
    DOES_NOT_NEED(0, "无需支付"),

    /**
     * 支付宝 - 1
     */
    ALIPAY(1, "支付宝"),

    /**
     * 微信支付 - 2
     */
    WECHAT_PAY(2, "微信"),

    /**
     * 银联支付 - 3
     */
    UNION_PAY(3, "银联"),

    /**
     * 余额支付 - 4
     */
    ACCOUNT_BALANCE(4, "余额支付"),

    /**
     * 线下支付线上确认 - 5
     */
    OFFLINE(5, "线下支付线上确认"),

    /**
     * 授信额度支付 - 6
     */
    CREDIT(6, "授信额度支付"),

    /**
     * 货到付款 - 7
     */
    COLLECT_ON_DELIVERY(7, "货到付款"),

    /**
     * 月结 - 8
     */
    MONTHLY_SETTLEMENT(8, "月结"),

    /**
     * 账期 - 9
     */
    ACCOUNT_PERIOD(9, "账期"),

    /**
     * 会员权益积分支付 - 10
     */
    RIGHT_POINT(10, "积分支付"),

    /**
     * 通联支付 - 微信支付
     */
    ALLIN_WECHAT(11, "微信支付"),

    /**
     * 通联支付 - 支付宝支付
     */
    ALLIN_ALI_PAY(12, "支付宝"),

    /**
     * 通联支付 - 快捷支付
     */
    ALLIN_QUICK(13, "快捷支付"),

    /**
     * 通联支付 - 网银支付
     */
    ALLIN_UNION(14, "网银支付"),

    /**
     * 通联支付 - 余额支付
     */
    ALLIN_BALANCE(15, "余额支付"),

    /**
     * 建行支付 - B2B支付
     */
    CCB_B2B(16, "B2B支付"),

    /**
     * 建行支付 - 数字人民币支付
     */
    CCB_DIGITAL(17, "数字人民币"),

    /**
     * 跨境电商进口支付 - 跨境电商进口
     */
    COMMERCE_IMPORT(18, "跨境电商进口");

    OrderPayChannelEnum(Integer code, String name) {
        this.code = code;
        this.name = name;
    }

    /**
     * 支付方式枚举值
     */
    private Integer code;

    /**
     * 支付渠道名称
     */
    private String name;

    public Integer getCode() {
        return code;
    }

    public String getName() {
        return LanguageHolder.getName(this.getClass(), this.getCode());
    }

    /**
     * 根据枚举值获得枚举
     * @param code 枚举值
     * @return 枚举
     */
    public static OrderPayChannelEnum parse(Integer code) {
        return Arrays.stream(OrderPayChannelEnum.values()).filter(e -> e.getCode().equals(code)).findFirst().orElse(null);
    }

    /**
     * 根据枚举值获得支付渠道名称
     *
     * @param code 枚举值
     * @return 支付渠道名称
     */
    public static String getNameByCode(Integer code) {
        return LanguageHolder.getName(OrderPayChannelEnum.class, code);
    }

    /**
     * 根据枚举值获得支付渠道名称
     *
     * @param code 枚举值
     * @return 支付渠道名称
     */
    public static String getNameByCode(Long code) {
        return LanguageHolder.getName(OrderPayChannelEnum.class, code.intValue());
    }
}
